package cn.bugstack.chatgpt.data.domain.openai.service;

import cn.bugstack.chatglm.model.*;
import cn.bugstack.chatgpt.data.domain.openai.model.aggregates.ChatProcessAggregate;
import cn.bugstack.chatgpt.data.domain.openai.model.entity.RuleLogicEntity;
import cn.bugstack.chatgpt.data.domain.openai.model.valobj.LogicCheckTypeVO;
import cn.bugstack.chatgpt.data.domain.openai.service.channel.impl.ChatGLMService;
import cn.bugstack.chatgpt.data.domain.openai.service.channel.impl.DeepSeekService;
import cn.bugstack.chatgpt.data.domain.openai.service.rule.ILogicFilter;
import cn.bugstack.chatgpt.data.domain.openai.service.rule.factory.DefaultLogicFactory;
import cn.bugstack.chatgpt.data.types.enums.ChatGLMModel;
import cn.bugstack.chatgpt.data.types.exception.ChatGLMException;
import com.alibaba.fastjson.JSON;
import com.fasterxml.jackson.core.JsonProcessingException;
import lombok.extern.slf4j.Slf4j;
import okhttp3.sse.EventSource;
import okhttp3.sse.EventSourceListener;
import org.apache.commons.lang3.StringUtils;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.springframework.stereotype.Service;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyEmitter;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * 实现了父类中的抽象方法，以流式响应的方式发送应答
 */
@Service
@Slf4j
public class ChatService extends AbstractChatService {

    @Resource
    private DefaultLogicFactory logicFactory;

    public ChatService(DeepSeekService deepSeekService, ChatGLMService chatGLMService) {
        super(deepSeekService, chatGLMService);
    }

    @Override
    //可变参数语法：语法糖，tring... logics
    //等价于传入一个 String[] 数组，但使用时更灵活，例如：
    protected RuleLogicEntity<ChatProcessAggregate> doCheckLogic(ChatProcessAggregate chatProcess, String... logics) throws Exception {
        Map<String, ILogicFilter> logicFilterMap = logicFactory.openLogicFilter();// 使用已经注册好的策略工厂，获取里面的策略集合
        RuleLogicEntity<ChatProcessAggregate> filter = null;
        for (String code : logics) {
            filter = logicFilterMap.get(code).filter(chatProcess);//从策略工厂的Map中获取filter实例，也就是哪个filter逻辑，然后执行filter方法，进行该规则的过滤
            if (!LogicCheckTypeVO.SUCCESS.equals(filter.getType())) return filter;//如果该规则过滤结果失败，就立刻返回这个结果，不往下进行
        }
        return filter; // 如果全部过滤器执行成功，那就返回最后一次执行的结果（通常是一个 SUCCESS 类型的 RuleLogicEntity）
    }

}
